///*
// * 描述： <描述>
// * 修改人： rain
// * 修改时间： 2016年5月22日
// * 项目： rainhy-webcore
// */
//package com.rainhy.incrementer.producer;
//
//import java.sql.Connection;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.sql.Statement;
//import java.util.HashMap;
//import java.util.Map;
//
//import javax.annotation.Resource;
//import javax.sql.DataSource;
//
//import org.springframework.beans.factory.InitializingBean;
//import org.springframework.dao.DataAccessResourceFailureException;
//import org.springframework.jdbc.datasource.DataSourceUtils;
//import org.springframework.jdbc.support.JdbcUtils;
//import org.springframework.stereotype.Component;
//
//import com.alibaba.druid.util.JdbcConstants;
//import com.rainhy.webcore.incrementer.IncrementerContext;
//import com.rainhy.webcore.incrementer.IncrementerProducer;
//import com.rainhy.webcore.incrementer.service.IncrementerService;
//
///**
// * 自增长器生产者 - mysql
// * 
// * @author rain
// * @version [版本号, 2016年5月22日]
// * @see [相关类/方法]
// * @since [产品/模块版本]
// */
//@Component("rainhy.webcore.incrementer.producer.mysql")
//public class IncrementerProducerByMySql implements IncrementerProducer, InitializingBean {
//    
//    /** 自增长 Service */
//    @Resource(name = "rainhy.webcore.incrementer.service")
//    private IncrementerService service;
//    
//    /** 下一个值 */
//    private Map<String, Long> nextMap = new HashMap<>();
//    
//    /** 最大值 */
//    private Map<String, Long> maxMap = new HashMap<>();
//    
//    /** 数据源 */
//    private DataSource dataSource;
//    
//    /** 自增长器容器 */
//    @Resource(name = "rainhy.webcore.incrementer.context")
//    private IncrementerContext context;
//    
//    @Override
//    public String getDataSourceType() {
//        return JdbcConstants.MYSQL;
//    }
//    
//    @Override
//    public long getNextValue(String incrementerType, int cacheSize, int startValue) {
//        if (!this.maxMap.containsKey(incrementerType)) {
//            this.maxMap.put(incrementerType, Long.valueOf(startValue));
//            initIncrementerType(incrementerType, startValue);
//        }
//        if (!this.nextMap.containsKey(incrementerType)) {
//            this.nextMap.put(incrementerType, this.maxMap.get(incrementerType));
//        }
//        
//        long maxId = this.maxMap.get(incrementerType).longValue();
//        long nextId = this.nextMap.get(incrementerType).longValue();
//        
//        if (maxId == nextId) {
//            Connection con = DataSourceUtils.getConnection(dataSource);
//            Statement stmt = null;
//            try {
//                stmt = con.createStatement();
//                DataSourceUtils.applyTransactionTimeout(stmt, dataSource);
//                stmt.executeUpdate("update core_incrementer set incValue = last_insert_id(incValue + " + cacheSize + ") where incType = '" + incrementerType + "'");
//                ResultSet rs = stmt.executeQuery("select last_insert_id()");
//                try {
//                    if (!rs.next()) {
//                        throw new DataAccessResourceFailureException("last_insert_id() failed after executing an update");
//                    }
//                    maxId = rs.getLong(1);
//                    this.maxMap.put(incrementerType, Long.valueOf(maxId));
//                } finally {
//                    JdbcUtils.closeResultSet(rs);
//                }
//                nextId = maxId - cacheSize + 1L;
//            } catch (SQLException ex) {
//                throw new DataAccessResourceFailureException("Could not obtain last_insert_id()", ex);
//            } finally {
//                JdbcUtils.closeStatement(stmt);
//                DataSourceUtils.releaseConnection(con, dataSource);
//            }
//        } else {
//            nextId++;
//        }
//        this.nextMap.put(incrementerType, Long.valueOf(nextId));
//        return nextId;
//    }
//    
//    /**
//     * 
//     * 初始化自增长表(如果不存在表,则建表)
//     *
//     * @return void [返回类型说明]
//     * @exception throws [异常类型] [异常说明]
//     * @see [类、类#方法、类#成员]
//     * @version [版本号, 2016年5月22日]
//     * @author rain
//     */
//    private void initIncrementerTable() {
//        Connection con = DataSourceUtils.getConnection(dataSource);
//        Statement stmt = null;
//        try {
//            stmt = con.createStatement();
//            DataSourceUtils.applyTransactionTimeout(stmt, dataSource);
//            stmt.executeUpdate("CREATE TABLE IF NOT EXISTS core_incrementer (incValue INT NOT NULL, incType VARCHAR(128) NOT NULL) ENGINE=MyISAM COMMENT='自增长表'");
//        } catch (SQLException ex) {
//            throw new DataAccessResourceFailureException("Could not init IncrementerTable!", ex);
//        } finally {
//            JdbcUtils.closeStatement(stmt);
//            DataSourceUtils.releaseConnection(con, dataSource);
//        }
//    }
//    
//    /**
//     * 
//     * 初始化自增长类型(向表插入自增长类型记录)
//     *
//     * @param incrementerType 自增长类型
//     * @param startValue 起始值
//     * 
//     * @return void [返回类型说明]
//     * @exception throws [异常类型] [异常说明]
//     * @see [类、类#方法、类#成员]
//     * @version [版本号, 2016年1月21日]
//     * @author rain
//     */
//    private void initIncrementerType(String incrementerType, int startValue) {
//        Connection con = DataSourceUtils.getConnection(dataSource);
//        Statement stmt = null;
//        try {
//            stmt = con.createStatement();
//            DataSourceUtils.applyTransactionTimeout(stmt, dataSource);
//            ResultSet result = stmt.executeQuery("SELECT INCVALUE, INCTYPE FROM CORE_INCREMENTER WHERE INCTYPE = '" + incrementerType + "'");
//            if (!result.next()) {
//                stmt.executeUpdate("INSERT INTO CORE_INCREMENTER (INCVALUE, INCTYPE ) VALUES( " + startValue + ", '" + incrementerType + "')");
//            }
//        } catch (SQLException ex) {
//            throw new DataAccessResourceFailureException("Could not init IncrementerTable!", ex);
//        } finally {
//            JdbcUtils.closeStatement(stmt);
//            DataSourceUtils.releaseConnection(con, dataSource);
//        }
//    }
//    
//    @Override
//    public void afterPropertiesSet() throws Exception {
//        dataSource = context.getDataSource();
//        if (dataSource != null) {
//            initIncrementerTable();
//        }
//    }
//    
//    @Override
//    public boolean isSupport() {
//        return dataSource != null;
//    }
//}
